home *** CD-ROM | disk | FTP | other *** search
- INTRODUCCION AL ASM: LA INSTRUCCION MOV (II)
- ============================================
-
- Continuamos con los modos de direccionamiento que admite el 8086. Para
- poder dar una tabla completa con todos los modos de direccionamiento que
- faltan, introduzco dos registros que todavía no habíamos visto: el primero es
- el registro 'SS' (de 'Stack Segment', 'segmento de pila'), que es otro registro
- que se usa como el CS, el DS y el ES para construir direcciones completas. La
- instrucción 'MOV' se puede usar con este registro de la misma manera que con
- los otros tres registros de segmento. El otro registro es el 'BP' (de 'Base
- Pointer', 'puntero base'). Este registro se puede utilizar de la misma forma
- que los registros de propósito general, aunque no se puede acceder por separado
- a los bytes alto y bajo. Además veremos como presenta algunos modos de direc-
- cionamiento peculiares.
-
- Para no alargarme demasiado, presento una tabla con una instrucción de cada
- modo de direccionamiento. Ya que el valor que indica la posición de memoria es
- siempre un valor de 16 bits, se complementa con un registro de segmento para
- formar la dirección absoluta. En la tabla aparece también el segmento que el uP
- toma por defecto para completar la dirección. Más adelante veremos cómo podemos
- hacer que una instrucción use el registro de segmento que nos interese en lugar
- del registro por defecto.
-
- INSTRUCCION REGISTRO POR DEFECTO
- -------------------- --------------------------
- MOV AX,[BX+SI+xx] DS
- MOV AX,[BX+DI+xx] DS
- MOV AX,[BP+SI+xx] SS <- !!
- MOV AX,[BP+DI+xx] SS <- !!
- MOV AX,[SI+xx] DS
- MOV AX,[DI+xx] DS
- MOV AX,[BP+xx] DS
- MOV AX,[BX+xx] DS
-
- Estos modos de acceso a memoria se añaden a los ya vistos en el capítulo
- anterior, que aparecen en la siguiente tabla:
-
- INSTRUCCION DESCRIPCION
- -------------------- --------------------------------------------------
- MOV AX,BX Transferencia de un registro a otro
- MOV AX,55AAh Carga de un registro directamente con un valor
- MOV AX,[55AAh] Transferencia de una dirección de memoria dada
- directamente a un registro
- MOV AX,[BX] Acceso a memoria por medio del BX
- MOV AX,[SI] Acceso a memoria por medio del registro índice SI
- MOV AX,[DI] Acceso a memoria por medio del registro índice DI
- MOV AX,[BP] Acceso a memoria por medio del registro BP
-
- Estas instrucciones, que ya vimos, generan accesos a memoria completando la
- dirección, por defecto, con el DS.
-
- También son posibles las instrucciones generadas invirtiendo los operandos
- de las instrucciones de ambas tablas. Es decir, todos estos modos de direccio-
- namiento pueden usarse tanto para lectura (en las tablas) como para escritura.
-
- Y para acabar con los modos de direccionamiento, tenemos uno bastante pecu-
- liar que describimos dando un ejemplo:
-
- MOV [55AAh], 3322h
-
- Esta instrucción almacena en la dirección 55AAh el valor 3322h, sin acceder
- en toda la operación a ningún registro.
-
- Pero las instrucciónes que almacenan directamente un valor en memoria pre-
- sentan un problema para el ensamblador: cuando uno de los dos operandos (el
- destino o el origen) es un registro, con ése operando se fija el tamaño del
- dato a mover. Pero en este caso, es necesario indicar al ensamblador el tamaño
- del dato a mover, de forma que pueda generar el código de operación correspon-
- diente. Esto se puede hacer añadiendo a cualquiera de los operandos unas pala-
- bras que indican si se refiere a un operando de tipo byte o de tipo palabra.
- En los siguientes ejemplos se ve cómo se hace esto:
-
- MOV WORD PTR [55AAh],3322h ; almacena los dos bytes
- MOV BYTE PTR [55AAh],20h ; almacena un solo byte
- MOV WORD PTR [BX],0 ; almacena dos bytes
-
- Estos 'typecasts', que es como se denominan formalmente, pueden añadirse en
- todos los casos, pero no son imprescindibles. A modo de ejemplo, las instruc-
- ciones siguientes son aceptadas por el ensamblador:
-
- MOV AX,WORD PTR [BX]
- MOV BYTE PTR [BP+4],CL
-
- Ahora que ya conocemos algunas de las instrucciones que podemos emplear en
- ensamblador, veremos cómo podemos experimentar con ellas y ver cómo se modifi-
- can los registros. Para ello usaremos el DEBUG del MS-DOS, pero fácilmente po-
- demos hacer lo mismo con el SID del DR-DOS o con el SYMDEB, que es un DEBUG
- bastante mejorado, también de Microsoft.
-
- Lo primero es cargar el DEBUG sin ningún parámetro desde la línea de coman-
- dos del DOS. Entonces aparece un mensaje de copyright en la pantalla, tras lo
- que tendremos un guión ('-') que es prompt con el que DEBUG nos invita a que
- introduzcamos un comando. Si escribimos 'R' y pulsamos RETURN, el programa
- nos muestra el contenidos actual de los registros del 8086 y la instrucción
- apuntada por el par CS:IP, que es la siguiente instrucción que debe ejecutar
- el uP. El comando 'T' ejecuta la siguiente instrucción y vuelve a mostrar los
- registros. El registro IP habrá variado, de manera que apuntará a la siguiente
- instrucción.
-
- Uno de los comandos que más usaremos para experimentar con el DEBUG será
- el comando 'A', que nos permite introducir código fuente en ASM (instrucciones
- en lenguaje ensamblador) y lo ensamblará en la dirección apuntada por CS:IP.
- Cuando queramos volver al prompt del DEBUG, pulsaremos RETURN al principio de
- una línea. Para desensamblar el código a partir de la dirección actual usare-
- mos el comando 'U' de 'unassemble' ('desensamblar'). Tanto el comando 'A' como
- el comando 'U' aceptan opcionalmente una dirección de memoria (en hexadecimal,
- ya que a DEBUG hay que darle todos los números en hex.), que puede ser una di-
- rección compuesta por segmento y offset (con ':' en medio) o sólo por un
- 'offset' (y se asume el CS actual).
-
- Por ejemplo, podemos probar las siguientes indicaciones:
-
- -Cargar DEBUG, escribir 'A' y pulsar RETURN.
- -Aparecerá la dirección de memoria actual (xxxx:100, donde xxxx puede
- variar), seguida de un cursor. Podemos escribir instrucciones ASM.
- Escribimos 'MOV AX,2233' y pulsamos RETURN.
- -Escribimos 'MOV AH,0' y pulsamos RETURN.
- -Pulsamos RETURN, con lo que volveremos al prompt de DEBUG.
- -Escribimos 'T' y pulsamos RETURN, con lo que se ejecuta la primera
- instrucción e IP avanza a 102h. Podemos observar que AX ahora vale
- 2233, debido al 'MOV AX,2233' que acabamos de ejecutar.
- -Escribimos de nuevo 'T' y pulsamos RETURN, con lo que se ejecuta la
- siguiente instrucción. Podemos observar que el contenido de AX es
- ahora 0033, ya que hemos almacenado el valor 00 en AH, que es el byte
- alto de AX.
-
- Os recomiendo que experimentéis con los distintos modos de direccionamiento.
- Con el comando 'D' podéis ver el contenido de una zona de memoria, dando como
- parámetro la dirección a partir de la que mostrar el contenido. Esta dirección
- puede ser de la forma SEG:OFF, o puede ser un offset, tomándose en tal caso el
- valor de DS para completar la dirección.
-
- Ahora introduciremos las instrucciones aritméticas del 8086, al menos las
- básicas, de forma que podréis experimentar con ellas en el DEBUG. Se presenta
- una tabla con la descripción de cada una, ya que su comprensión no ofrece gran
- dificultad. Después de la tabla se comentan con más detalle las instrucciones:
-
- INSTRUCCIONES ARITMETICAS BASICAS
- -----------------------------------
- Instrucción Descripción
- .................... ....................................................
- ADD destino,origen Suma los operandos origen y destino, y almacena el
- resultado en destino.
- SUB destino,origen Resta los operandos origen y destino, y almacena el
- resultado en destino.
- INC destino Suma 1 (incrementa) al operando destino.
- DEC destino Resta 1 (decrementa) al operando destino.
- NEG destino Asigna al operando destino el complemento a dos del
- contenido anterior del operando destino. Esto repre-
- senta cambiar el signo de un número binario.
-
- Las instrucciones ADD y SUB aceptan exactamente los mismos modos de direc-
- cionamiento que la instrucción MOV, por lo que todos los ejemplo dados antes
- sirven para estas instrucciones sin más que cambiar el MOV por el ADD o el SUB.
- Exceptuando que sólo se pueden aplicar estas operaciones a los registros AX,
- BX, CX, DX, SI, DI, BP y a los registros de un byte (AL, AH,...), pero no a los
- registros de segmento.
-
- Las instrucciones INC, DEC y NEG aceptan como operando un registro (que no
- sea de segmento) o una referencia a memoria, usando cualquiera de los modos de
- direccionamiento descritos para la instrucción MOV.
-
- En el siguiente capítulo introduciremos la pila de la máquina, y puede que
- las interrupciones.
-
- Después, con todos estos conceptos comenzaremos a describir el uso de los
- ensambladores como el MASM o el TASM, veremos el famoso 'Hello, world' en ASM
- y seguiremos con el juego de instrucciones del 8086: saltos condicionales (y
- veremos los flags), comparaciones, etc... En muy poco tiempo estaréis todos
- programando en ASM. ¡¡¡Animad a la gente a que se apunte!!!
-
- Salut! :-)
-
- Jon